﻿#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
	//打开文件，用w来打开时若原路径没有该文件，会创建一个新文件
	//. 表示当前目录
    //.. 表示上一级路径
	FILE* pf = fopen("text12_14.txt", "w+");
	//打开失败会返回空指针
	if (pf == NULL)//检验是否打开成功
	{
		perror("fopen");
		return 1;
	}
	//fputc: 该函数用于向文件流中写入一个字符
	//这个函数将指定的字符c写入到指定的文件流中，成功时返回写入的字符，失败时返回错误代码
	// int fputc(int c, FILE *stream);
	//写入字符
	for (int i = 0; i < 7; i++)
	{
		fputc('a' + i, pf);//将字符'a'+i写入文件
		fputc(' ', pf);
	}

	rewind(pf);
	//用rewind函数使光标回到起始位置

	//fgetc: 该函数用于从文件流中读取一个字符
	//这个函数从指定的文件流中读取下一个字符，并返回该字符的ASCII码值（或EOF表示文件结束）
	// int fgetc(FILE *stream);
	//从文件中读取字符
	int ch = 0;

	for (int i = 0; i < 14; i++)
	{
		 ch = fgetc(pf);//每次读取，光标自动向后，下次读取就直接向后面读取了
		printf("%c", ch);//%c是因为ch是int类型
	}

	rewind(pf);
	//fgets: 该函数用于从文件流中读取一行字符串
	//这个函数从指定的文件流中读取最多num-1个字符（遇到换行符或文件结束），并将其存储到str指向的字符数组中。
	//char *fgets(char *str, int num, FILE *stream);
	char arr[20] = { 0 };
	fgets(arr, 15, pf);//从pf中拷贝14个字符到arr中
	printf("\n");
	for (int i = 0; i < 14;i++)
	{
		printf("%c", arr[i]);
	}

	//fputs: 该函数用于向文件流中写入一个字符串
	//这个函数将指定的字符串str写入到指定的文件流中，不包括字符串的结束符\0，成功时返回非负值，失败时返回EOF
	//int fputs(const char *str, FILE *stream);

	rewind(pf);
	FILE* pd = fopen("text12_14_2.txt", "w+");
	if (pd == NULL)//检验是否打开成功
	{
		perror("fopen");
		return 1;
	}
	fputs(arr, pd);//将arr字符串内容拷贝到pd

	//fread: 该函数用于从文件流中读取一块数据(⼆进制输⼊)
	//这个函数从指定的文件流中读取count个元素，每个元素的大小为size字节，并将其存储到以ptr为起始地址的内存块中
	//size_t fread(void *ptr, size_t size, size_t count, FILE *stream);

	//fwrite: 该函数用于向文件流中写入一块数据
	//这个函数从以ptr为起始地址的内存块中写入count个元素，每个元素的大小为size字节，写入到指定的文件流中
	//size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

	FILE* p = fopen("text_1.txt", "w+");
	int a = 10;
	char b[10] = "hello";
	float c = 7.;
	////二进制的形式写文件
	fwrite(&a, 1, sizeof(int), p);
	fwrite(&c, 1, sizeof(float), p);
	fwrite(b, 5, sizeof(b[0]), p);

	printf("\n");
	rewind(p);

	////二进制的形式读文件
	int A = 0;
	float C = 0.;
	char B[10] = { 0 };
	fread(&A, 1, sizeof(int), p);
	fread(&C, 1, sizeof(float), p);
	fread(B, 5, sizeof(b[0]), p);
	printf("%d,%s,%f", A, B, C);

	printf("\n");

	//scanf: 该函数用于从文件流中读取格式化的数据
	// int fscanf(FILE * stream, const char* format, ...);
	// 这个函数可以从指定的文件流中读取格式化的数据，并将其存储到指定的变量中

	//fprintf: 该函数用于将格式化的数据写入文件流中
	// int fprintf(FILE * stream, const char* format, ...);
	// 这个函数可以把格式化的数据输出到指定的文件流（例如标准输出、文本文件等）

	fscanf(p, "%s %d %f", B, &A, &C);
	fprintf(stdout, "%s %d %.1f\n", B, A, C);

	fclose(pf);//要记得用fclose关闭文件，并把pf指向空指针
	fclose(pd);
	fclose(p);
	pd = NULL;
	pf = NULL;
	p = NULL;

	return 0;
}

#include<stdlib.h>
//
//int main()
//{
//	char a[50] = "\0", b[50] = "\0", * p, * k;
//	gets(a);
//	p = a;
//	k = b;
//	while (*p != '\0')
//	{
//		*k = *p;
//		printf("%c", *k);
//		p++;
//		k++;
//		
//	}
//
//	return 0;
//}